"use strict";
// 1、any类型
// any的含义是:任意类型，一旦将变量类型限制为any，那就意味着放弃了对该变量的类型检查
let a; //显式any
a = 123;
a = false;
a = 'hello';
let b; //隐式any
b = 123;
b = false;
b = 'hello';
//注意点: any类型的变量可以赋值给任意类型的变量(污染别人)
let x;
x = 99;
// 此时a的值为‘hello’，x为99，赋值后x也为'hello'了
x = a; //此时x也变成了any类型了
// 2、unknown类型
//（1）、unknown可以理解为一个类型安全的any,适用于不确定数据的具体类型
let aaa;
aaa = false;
aaa = 'hello';
aaa = 123;
let xxx;
// （2）、unknown 会强制开发者在使用之前进行类型检查，从而提供更强的类型安全性
xxx = "123";
// xxx = aaa  //报错
// 如果确实要将aaa的赋值给xxx的话，则需要这样做，有三种方法
// 第一种
if (typeof aaa === 'string') {
    xxx = aaa; //让aaa为字符串时再赋值给XXX，这样就不会报错
}
// 第二种 断言，第一种写法
xxx = aaa;
// 第三张 断言，第二种写法
xxx = aaa;
// (3)、读取any类型数据的任何属性都不会报错，而unknown正好与之相反
let str1;
str1 = 'hello';
str1.toUpperCase(); //不会报错
let str2;
str2 = 'hello';
str2.toUpperCase(); //不会报错
str2.aaa; //不会报错
str2.sss(); //不会报错
let str3;
str3 = 'hello';
// str3.toUpperCase()   //报错,"str3的类型为未知"
// 想要使用str3身上的属性，则需要通过断言强制知道str3的类型为string
str3.toUpperCase(); //无报错
// 3、never类型
// never的含义是：任何值都不是，简而言之就是不能有值，undefined、null、''、0都不行
// (1)、几乎不用never去直接限制变量，因为 没有意义
let navStr; //指定navStr为never意味着navStr以后不能存任何的数据
// (2)、never一般是TS主动推断出来的
let preStr;
preStr = 'hello';
if (typeof preStr === 'string') {
    console.log('preStr', preStr.toUpperCase());
}
else {
    console.log('此时鼠标放到右边的preStr变量上显示的是never', preStr);
}
// (3)、never一也可以用于限制函数的返回值
//返回“never”的函数不能具有可访问的终结点：(说白了就两种情况，无限死循环，或者函数执行中遇到错误被打断)
// function deve():never{}  //报错，因为deve虽然没有明文写return，但是JS引擎中，函数运行完成后会return一个undefined 
function deve() {
    console.log('这是一个无限死循环，这种函数没有意义');
    deve();
}
function myNever() {
    throw new Error('程序异常！！！这是一个错误信息！！！');
}
// 4、void 类型
// (1)、void通常用于函数返回值的声明，含义:【函数不返回任何值,调用者也不应依赖其返回值进行任何操作】
function logMsg(msg) {
    console.log('logmsg', msg);
}
let res = logMsg('不能依赖其返回值进行任何操作');
// if(res){   //报错，因为void声明的函数返回值不能作为依赖去进行操作
// }
// 编码者没有编写return去知道函数的返回值，所以logMsg函数是没有显式返回值的，但会有一个隐式返回值，就是undefined，
// 即：虽然函数返回类型为void，但也是可以接受undefined的,简单记，undefined是void可以接受的一直"空"
// (2)、以下写法均符合规范
function logMsg1(msg) {
    console.log('logmsg1', msg);
}
function logMsg2(msg) {
    console.log('logmsg2', msg);
    return;
}
function logMsg3(msg) {
    console.log('logmsg3', msg);
    return undefined;
}
// 理解void与undefined
// void是一个广泛的概念，用来表达"空"，而undefined则是这种"空"的具体实现之一
// 因此可以说undefined是void能接受的"空"状态的一种具体形式
// 换句话说:void包含undefined,但void表达的语义超越了单纯的undefined,它是一种意图上的约定,而不仅仅是特定值的限制
